#! /usr/bin/python
# coding=utf-8
# # bool类型 首字母大写
# a = True
# b = False
#
# print a
# print b
# print type(a)
#
# # 输入输出
#
# mystr = raw_input('> ')
# print mystr
# print type(mystr)
# print 2 * int(mystr)
# print 100 + int(mystr)
# #
# # int()也是内建函数
# # python 不会隐式的将数字转换为字符串
#
# # 静态类型 运行时不允许类型转化
# # 动态类型 运行时可以进行类型转换
# # 强类型 不允许类型隐式转换
# # 弱类型
#
# # C语言   弱类型            静态类型
# # C++     强类型（有争议）  静态类型
# # java    强类型            静态类型
# # python  强类型            动态类型
# # shell   弱类型            动态类型
#
#
# # 操作符
# # 大部分运算符同C语言
# # python 中的除法有三种风格
# #    1.传统除法
#
# a = 1
# b = 2.0
# c = 2
# print a/b
# print a/c
#
# #   2.地板（floor）除法 向下取整
# a = 1
# b = 2
# c = -1
# print a//b
# print c//b
# # 负数向下取整（和C语言不同）

#   3.精确除法
from __future__ import division
a = 1
b = 2
print a/b

# 乘方
a = 100
b = 23
result = a ** b
print result
# python 中也支持逻辑运算符 and or not
# 也支持短路求值

print 2 < 3 < 4
# 2 < 3 and 3 < 4
# 如果是在C语言中 2 < 3 值为1   1 < 4

# ******************元组 列表  字典*******************

# 认识列表
# 类似于C语言的数组
a = [1, 2, 3, 4]
print a
# 可以不同的类型元素都存放在里面

a = [1, 'hehe', 3, 4, 5]
print a

print a[0]
print a[1]
print a[2]
print a[3]

print a[-2]
print a[1: 4]
a[0] = 'nihao'
# 像修改数组一样
print type(a)

# 认识元组（tuple）
# 和列表的区别就是不可以修改
a = (1, 2, 3, 4)
print a
print a[0]
print a[1]
print a[2]
print a[-2]

# a[2] = 3

# 认识字典（哈希表）
a = {'ip': '127.0.0.1', 'port': 8080}
print a
print a['ip']
print a['port']

# 理解引用
# python 中定义变量并没有开辟空间 i
# 而是将变量名这个标签贴在对应的内存上
# 当这个我们显示修改这个变量的值，其实就是将这个标签又重新贴在另一块内存上
a = 100
print id(a), id(100)
# id()内建函数,并不是虚拟地址，也不是物理地址
# id()只是表示对象唯一性的标号
a = 200
print id(a), id(200)
b = a
print id(a), id(b), id(200)

# *********************代码块及缩进****************

# 在其他的编程语言中用{}来表示代码块
# python中用缩进来表示代码块 相当于从语法角度规定了代码风格

# if语句
a = 1
if a < 1:
    print 'a < 1'
elif a == 1:
    print 'a = 1'
else:
    print 'a > 1'
# python 中没有 switch 语句

# 循环语句

count = 0
while count < 3:
    print count
    count += 1

# 认识for 循环
# C 语言中的for(;;;)
# python 中 for_each


mystr = 'abcd'
for c in mystr:
    print c
# C++中的range based for
# vector<int> vec
# for(int item : vec)
#   print item

for item in [1, 2, 3, 4]:
    print item

a = {'ip': '127.0.0.1', 'port': 8080}
for key in a:
    print key, a[key]

for i in range(1, 102, 2):
    print i
# [1,102) 步长为 2
# 上面代码就可以将 1 到 102 之间的奇数打印出来


# break语句
# 打印 1 到 100 之间第一个为 3 的倍数的数字
for i in range(1, 101):
    if i % 3 == 0:
        break
print i
# 看到上面代码 中 i 是出for循环作用域 还能使用

# continue语句
# 打印 1 到 100 之间 所有 3 的倍数
for i in range(1, 101):
    if i % 3 != 0:
        continue
    print i

# pass 语句
# 有时候用到了 空语句 什么都不做 由于没有{} 需要用一个专门的语句来占位

#  列表解析 获取 1 到 100 序列 的平方序列
#  即 1 4 9 16 25 ......
print [x ** 2 for x in range(1, 101)]
# 获取 1 到 100 序列中 为 3 的倍数的平方
print [x ** 2 for x in range(1, 101) if x % 3 == 0]

# 函数
# 函数定义
def Add(x, y):
    z = x + y
    return z
# 函数的使用
ret = Add(10, 20)
print ret

ret = Add('hello ', 'world')
print ret
# 运行时报错 两个类型可以相加

# C++ 中函数重载
# 函数签名不同 参数类型 CV限定符
# 没有函数重载

# 后面的会覆盖前面的
# 类似于变量重新赋值
# 类型为function类型
# def Add(x, y, z):
#     return x + y + z
# ret = Add(1, 2)
# print ret


# python 支持默认参数
def Add(x, y, z=0):
    return x + y + z

ret = Add(19, 29)
print ret
ret = Add(19, 29, 20)
print ret

# 支持多个返回值
def Get():
    x = 10
    y = 20
    return x, y
a, b = Get()
print a
print b

# unpack
# TODO

# ret , _=Top()

# 可调用对象

func = Add
print func(10, 20)

# 函数的属性
print dir(Add)

# 文件操作

# 打开文件
# rb  rt
# 返回的是文件对象
f = open('./1test.py', 'w')
f.write('aaa  ')
f.write('bbb  ')
f.write('ffff  ')
# 关闭文件对象
f.close()
# print 带上 ，就不会换行
# 统计词频
# 文件多行 每行一个单词
data = {}
f = open('./1test.py', 'r')

for line in f:
    if line in data:
        data[line] += 1
    else:
        data[line] = 1
f.close()













































































































